/*
 * IoSession.h
 *
 *  Created on: 2013. 7. 23.
 *      Author: ncanis
 */
#pragma once

#include "stdafx.h"
#include "AbstractSocket.h"
#include "SocketSessionConfig.h"
#include "IoSession.h"
namespace TED {

/**
	@author ncanis
	@brief 네트웍 세션 클래스, 원격지와 연결시 하나의 세션이 할당된다.
*/
//to avoid circular dependencies among headers.
class DefaultIoSession : public IoSession{
private:
	static volatile ULONG sessionIndex;
	LONG_PTR sessionId; // 세션아이디;
	AbstractSocket* socket;
	SOCKET sock; //연결된 소켓정보
	CHAR* recvBuffer;
	SocketSessionConfig* config;

	NetInfo localAddress; //로컬 바인딩 주소
	NetInfo remoteAddress; // 리모트 바인딩 주소
	bool connected; //연결 확인
public:
	DefaultIoSession();
	DefaultIoSession(ULONG sessionId,  AbstractSocket* socket, SOCKET sock, SocketSessionConfig* config);
	virtual ~DefaultIoSession();

	//
	const SocketSessionConfig* GetConfig();
	const ULONG GetID();
	SOCKET GetSocket();

	void Send(IoBuffer& buf); // 버퍼는 전송된이후 메모리에서 제거된다.
	void Close();
	CHAR* GetRecvBuffer();

	NetInfo& GetRemoteAddress();
	NetInfo& GetLocalAddress();
	bool IsConnected();
};

}